package com.sname.demozuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

import javax.servlet.http.HttpServletRequest;

/**
 * Created By  醉美柳舞之众星捧月
 *
 * @author 宋贤坤
 * @date 2018/11/19 18:13
 */
public class TokenFilter extends ZuulFilter {
    /**
     * 过滤器的类型
     * pre:主要是用在路由映射
     * routing：请求具体路由转发
     * error：出错过后
     * post：所有的调用完了才会调用这个过滤器
     *
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 这个返回的数字越大,调用就越靠后
     * 数字越小,优先级越高
     *
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 控制过滤器是否生效
     * true表示过滤器生效
     * false为不生效
     *
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
        // 此处的true或者false可以根据具体的逻辑来判断得出
    }

    /**
     * 过滤器实施逻辑的地方
     */
    @Override
    public Object run() {
        /**捕捉到http请求,获取当前的上下文*/
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String token = request.getParameter("token");
        if (token == null) {
            context.setResponseStatusCode(401);
            context.setSendZuulResponse(false);
            context.setResponseBody("un-authrized");

            // 在此处的异常配置就是要这样配置=====>>>>此处是过滤器的业务异常,并返回到页面上
            // 因为..在这个位置,是抛不出去异常的,只能用这种方式来操作返回到页面
            try {
            } catch (Exception e) {
                /**捕获错误,error.status_code,这个错误,一个字都不能错,如果出现这个错就置位401*/
                /**过滤器链会去捕获异常,得到的异常与此处的字符串如果一致则返回异常,所以此处的异常字符串是特定的不是乱写的*/
                context.set("error.status_code", 401);
                /**捕获异常,与上类似,e或者是Exception.Class*/
                context.set("error.exception", e);
                context.set("error.message", "what's wrong...");
            }
            return null;
        }
        return null;
    }
}
